package com.emit.utils;

import com.emit.vo.MenuVO;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Menu 转成树
 * @author zhangchao
 * @version 1.0.0
 * @date 2021-10-28
 */
public class MenuTreeBuilder {

    /**
     * 折叠菜单,递归
     *
     * 查询所有页面,而后根据父子关系,建立目录的 List<Menu> Children , 而后把这些处理好的目录加入结果集合中返回
     *
     * 由于有些页面是单独出现的,没有父目录,最后返回的结果集合中也要加上
     *
     * 所以使用一个map记录,所有处理过的,有父子关系的页面,最后遍历原始数据集,map里没有的,就是没有被处理的单独页面,加入结果集中返回
     */
    public static List<MenuVO> buildByRecursive(List<MenuVO> menus) {
        Map<MenuVO, Boolean> childMap = new HashMap<>();
        List<MenuVO> trees = new ArrayList<>();

        for (MenuVO menu : menus) {
            if ("0".equals(String.valueOf(menu.getParentId()))) {
                findChildren(menu, menus,childMap);
                trees.add(menu);
                childMap.put(menu, true);
            }
        }
        menus.stream()
                .filter(x -> !childMap.containsKey(x))
                .forEach(trees::add);
        return trees;
    }

    /**
     * 递归查找子节点
     */
    private static void findChildren(MenuVO parentMenu, List<MenuVO> menus,Map<MenuVO,Boolean> childMap) {
        for (MenuVO temp : menus) {
            if (parentMenu.getId().equals(temp.getParentId())) {
                if (parentMenu.getChildren() == null) {
                    parentMenu.setChildren(new ArrayList<>());
                }
                parentMenu.getChildren().add(temp);
                childMap.put(temp, true);
            }
        }
    }
}